/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xilinx;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

    
   
/**
 *
 * @author dani
 */
public class MyFile {
    private File file;
    private FileWriter fichero = null;
    private PrintWriter pw = null;
    private HashMap<String, String> tabla;
    private String[] datos = {"A","B","C","P","PCIN","indexA","indexB","indexC","indexP",
                            "indexPCIN","indexPrimerOp","indexSegundoOp","indexSigno1",
                            "indexSigno2","indexCarryInSel","indexModo","indexOperacionLogica",
                            "indexMultX", "indexMultY", "indexOperaciones"};

    public MyFile(File fichero)          
    {
        this.file=fichero;
        tabla= new HashMap<String, String>();
        inicializarTabla();
    }
    
    public MyFile()
    {
        file=null;
        tabla= new HashMap<String, String>();
        inicializarTabla();
    }
    
    public void inicializarTabla()
    {
        for(int i=0; i<datos.length;i++)
            tabla.put(datos[i], null);   
    }
    
    public String[] getDatos()
    {
        return datos;
    }
    
    public String  getDato(String dato)
    {
        String resul="";
        if(tabla.containsKey(dato))
            return tabla.get(dato);
        else
            return resul;
    }
            
    public File getFile()
    {
        return file;
    }
    
    
    
    public void abrirNuevaConfiguracion()
    {
      try 
        {
            FileNameExtensionFilter filtro = new FileNameExtensionFilter("Archivos con configración DSP", "confDsp");
            JFileChooser fileChooserCargar = new JFileChooser();
            fileChooserCargar.setFileFilter(filtro);
            fileChooserCargar.setDialogTitle("Cargar configuraciónn del DSP");
            int seleccion = fileChooserCargar.showOpenDialog(null);
            if (seleccion == JFileChooser.APPROVE_OPTION) 
            {
                File newFichero = fileChooserCargar.getSelectedFile();
                this.file=newFichero;
                lecturaConfi();
            }
        }
        catch (Exception e) 
        {
            JOptionPane.showMessageDialog(null, "Error al abri el archivo", "Error guardar archivo", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    
    public void guardarConfiguracion(ArrayList listaParametros)
    {
        BufferedWriter writer; //Para escribir en el fichero
        //Activamos el filtro para que nos muestre, por defecto, los archivos de texto
        File fichero=file;
        if (!(fichero == null)) // Añadimos al fichero existente
        {
            try 
            {   
                writer = new BufferedWriter(new FileWriter(fichero, false));
                guardarConfi(writer, listaParametros);
                writer.flush();
                writer.close();
            } 
            catch (IOException e) 
            {
                JOptionPane.showMessageDialog(null, "Error al guardar el archivo", "Error guardar archivo", JOptionPane.ERROR_MESSAGE);
            }
            JOptionPane.showMessageDialog(null, "El fichero de texto se ha guardado correctamente con los datos introducidos");
         }
        else
        {
            JFileChooser fileChooserGuardar = new JFileChooser();
            FileNameExtensionFilter filtro = new FileNameExtensionFilter("Archivos con configración DSP", "confDsp");         
            fileChooserGuardar.setFileFilter(filtro);
            fileChooserGuardar.setDialogTitle("Guardar los parametros establecidos");
            int seleccion = fileChooserGuardar.showSaveDialog(null);
            if (seleccion == JFileChooser.APPROVE_OPTION)
            {
                fileChooserGuardar.setFileSelectionMode(JFileChooser.FILES_ONLY);
                try 
                {
                    file = fileChooserGuardar.getSelectedFile();
                    if(accept(file,".confDsp"))
                        writer = new BufferedWriter(new FileWriter(file+".confDsp", false));
                    else
                        writer = new BufferedWriter(new FileWriter(file, false)); // Ponemos .txt para darle extension al archivo que creamos
                    guardarConfi(writer, listaParametros);
                    writer.flush();
                    writer.close();
                }    
                catch (IOException e) 
                {
                    JOptionPane.showMessageDialog(null, "Error al guardar el archivo", "Error guardar archivo", JOptionPane.ERROR_MESSAGE);
                }
 
            JOptionPane.showMessageDialog(null, "El fichero de texto se ha guardado correctamente con los datos introducidos");
            }   
            else 
            {
                JOptionPane.showMessageDialog(null, "ERROR: Error al guardar", "Mensaje de Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    public boolean accept(File dir, String extension) 
    {
        return dir.getName().endsWith(extension);
    }
    
    public void guardarComoConfiguracion(ArrayList listaParametros)
    {
       BufferedWriter writer; //Para escribir en el fichero
        //Activamos el filtro para que nos muestre, por defecto, los archivos de texto
        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Archivos con configración DSP", "confDsp");
        JFileChooser fileChooserGuardar = new JFileChooser();
        fileChooserGuardar.setFileFilter(filtro);
        fileChooserGuardar.setDialogTitle("Guardar los parametros establecidos");
        int seleccion = fileChooserGuardar.showSaveDialog(null);
        if (seleccion == JFileChooser.APPROVE_OPTION) 
        {
            file = fileChooserGuardar.getSelectedFile();
            
            fileChooserGuardar.setFileSelectionMode(JFileChooser.FILES_ONLY);
            try 
            {
                if(accept(file,".confDsp"))
                    writer = new BufferedWriter(new FileWriter(file+".confDsp", false));
                else
                    writer = new BufferedWriter(new FileWriter(file, false));
                guardarConfi(writer,listaParametros);
                writer.flush();
                writer.close();
            } 
            catch (IOException e) 
            {
                JOptionPane.showMessageDialog(null, "Error al guardar el archivo", "Error guardar archivo", JOptionPane.ERROR_MESSAGE);
            }
 
            JOptionPane.showMessageDialog(null, "El fichero de texto se ha guardado correctamente con los datos introducidos");
        } 
        else 
            JOptionPane.showMessageDialog(null, "ERROR: Error al guardar", "Mensaje de Error", JOptionPane.ERROR_MESSAGE);    
    }
    
    
    public void lecturaConfi()
    {
        FileReader fr = null;
        BufferedReader br = null;
        try 
        {
            fr = new FileReader (file);
            br = new BufferedReader(fr);
            String linea;
            int i=0;
            while((linea=br.readLine())!=null)
            {
               String dato=procesarLinea(linea);
               tabla.put(datos[i], dato);
               i++;
            }
        }
          catch (Exception e) 
        {
            e.printStackTrace();
        } 
    }
    
    public String procesarLinea(String linea)
    {
        String dato="";
        for(int i=0;i<linea.length();i++)
            if(linea.charAt(i)==',')
               return dato=linea.substring(i+1, linea.length());
        return dato;
    }
 
    public void guardarConfi( BufferedWriter escribir_buffer,ArrayList listaParametros)
    {
        try
        {
            for(int i=0; i<datos.length;i++)
            {
                if(i<5)
                {
                    String aux=(String) listaParametros.get(i);
                    escribir_buffer.write(datos[i]+","+aux+"\n");
                }
                else
                {
                    Integer aux=(Integer) listaParametros.get(i);
                    escribir_buffer.write(datos[i]+","+aux+"\n");
                }
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
    }
 

    public void generarFichero()
    {
        try
        {
            fichero = new FileWriter("prueba.txt");
            pw = new PrintWriter(fichero);
 
            for (int i = 0; i < 10; i++)
                pw.println("Linea " + i);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
           try 
           {
                // Nuevamente aprovechamos el finally para 
                // asegurarnos que se cierra el fichero.
                if (null != fichero)
                   fichero.close();
           } 
           catch (Exception e2) 
           {
                e2.printStackTrace();
           }
        }
    }
    
    public void copiarPlantilla()
    {
    
    File f=new File("plantilla.txt"); // f  carga el archivo 
    FileReader fr; 
       try 
        { 
            fr=new FileReader(f); // fr  crea el flujo hacia f 
            BufferedReader br=new BufferedReader(fr); // br  permite la lectura 
            String linea=br.readLine(); //  linea toma el valor de la primera linea 
            fichero = new FileWriter("prueba.txt");
            pw = new PrintWriter(fichero);
            
            
            while(linea!=null) // mientras haya datos en el archivo 
            { 
                linea=br.readLine(); 
                pw.println(linea);
            } 
             fr.close(); // cierra el archivo 
        } 
        catch(IOException e) 
        { 
            System.out.println("error"); // si no se pudo accede al archivo 
        } 
       finally 
       {
           try {
                // Nuevamente aprovechamos el finally para 
                // asegurarnos que se cierra el fichero.
                if (null != fichero)
                     fichero.close();
                } 
           catch (Exception e2) 
                {
                   e2.printStackTrace();
                }
     }
    }
    
    

    
    
    
}
